# author：LiuShihao
# data: 2020/11/24 1:59 下午
# youknow: 各位老铁,我的这套代码曾经有人出价三个亿我没有卖,如今拿出来和大家分享,不求别的,只求大家免费的小红心帮忙点一点,这里谢过了。
# desc: 列表的学习
a = 10
lis = ['hello','world',98]
print("列表的id",id(lis))      # 4545855304
print("列表的类型",type(lis))   # <class 'list'>
print("列表的值",lis)           # ['hello', 'world', 98]
"""
列表的创建:
    第一种方式：中括号
    第二种方式：调用内置函数list()
"""
list1 = [1,'2',"helloWorld"]
list2 = list([1,'2',"helloWorld"])
print(id(list1),type(list1),list1)  # 4466679688 <class 'list'> [1, '2', 'helloWorld']
print(id(list2),type(list2),list2)  # 4468344712 <class 'list'> [1, '2', 'helloWorld']
"""
列表的特点：
    1.列表顺序按顺序有序排序
    2.索引映射唯一个数据
    3.列表可以存储重复数据
    4.任意数据类型混存
    5.根据需要动态分配和回收内存
"""
lis = ['hello','world',98]
# lit[0]  代表取出列表中的第一个元素（0代表索引）   列表中最后一个元素的索引是-1， 所以从后向前数-3也是hello
print(lis[0],lis[-3])
"""
获取列表中指定元素的索引
    如果列表中存在重复元素，则只返回第一个元素的索引
    如果查询的元素在列表中不存在，会抛出ValueError
    可以在指定的start，stop之间查询。


获取列表中的单个索引
    正向索引从0到N-1
    逆向索引从-N到-1
    如果指定索引不存在，会抛出IndexError
    
"""
lis =['hello','world',98,'hello']
print(lis.index('hello'))  # 获取hello元素的索引 存在多个，只返回第一个的索引
# print(lis.index('python'))  # ValueError: 'python' is not in list python在列表中不存在，抛出异常
# print(lis.index('hello',1,3)) # 从索引为1开始到索引为3，但是不包括索引为3的元素  查找'hello'元素
print(lis.index('hello',1,4))
lis =['hello','world',98,'hello','world',897]
print(lis[2])  # 查找列表中索引为2的元素 即第三个元素98
print(lis[-3]) # 查找列表中索引为-3的元素 即倒数第三个元素'hello'
# print(lis[20])  # 超出索引范围 抛出异常list index out of range

"""
切片操作
获取列表中的多个元素  list[start,stop,step]
切片的结果：原列表片段的拷贝
切片的范围：start，stop
step：默认为1
"""
lst = [10,20,30,40,50,60,70,80]
print(lst[1:6:1])  # [20, 30, 40, 50, 60]  是一个新的列表对象
print(lst[1:6])   # 省略步长，默认为1
print(lst[1:6:])  # 冒号后省略步长也是可以的，默认为1
print(lst[1:6:2])  # 步长是2  [20, 40, 60]
print(lst[:6:2])   # 省略start不写，采用默认0
print(lst[1::2])   # 省略stop不写，采用默认即最大索引
# 步长为负数的情况
print(lst[::-1])   # start,stop 都采用默认  步长为-1   [80, 70, 60, 50, 40, 30, 20, 10]  相当于原列表逆序排列
print(lst[7::-1])  # start从7开始  stop采用默认，步长为-1 [80, 70, 60, 50, 40, 30, 20, 10]
print(lst[6:0:-2]) # start从6开始，stop为0，步长为-2，相当于从第七个元素开始，每次索引减2，到第一的元素为止 但是不包括第一个元素10
# in , not in 判断指定元素是否在列表中存在
print(10 in lst)
print(100 not in lst)
# 列表元素的遍历
for item in lst:
    print(item)
# 列表末尾添加元素   向列表中添加新元素后并没有创建新的列表对象
lst = [10,20,30]
print("添加类表之前",lst)
lst.append(40)
print("添加类表之后",lst)
print(lst)
lst2 = ['hello','world']
lst.append(lst2)
print(lst)  # [10, 20, 30, 40, ['hello', 'world']]
lst.extend(lst2)
print(lst)

# 在任意一个位置上新加元素
lst = [10,20,30]
print(lst)
lst.insert(1,90)  # 在原列表索引为1的位置上添加一个元素
print(lst)
# 在任意位置上添加N个元素
lst = [10,20,30]
print(lst)
lst3 = [True,False,'hello']  # 一个新列表lst3
lst[1:] = lst3 # start为1 stop默认最后  步长默认为1   将原列表切片的位置用新列表代替
print(lst)
# 列表中的删除操作
lst = [10,20,30,40,50,30]
print(lst)
# remove()  根据元素移除
lst.remove(30)  # 从列表中移除30 这个元素，如果有多个，只移除第一个元素
print(lst)
# pop()     根据索引移除
lst = [10,20,30,40,50,30]
print(lst)
lst.pop(1)
print(lst)
lst.pop()  # 如果没有索引，移除列表中的最后一个元素
print(lst)

# 切片操作  至少删除一个元素，将产生一个新的列表
lst = [10,20,30,40,50,30]
print(lst)
new_list = lst[1:3]  # 从1开始  到3结束（不包括3）
print(new_list)
# 不产生新列表 而是删除原列表中的元素
lst = [10,20,30,40,50,30]
print(lst)
lst[1:3] = []  # 将切片的列表用一个空列表替代
print(lst)
# clear（）清空列表  清除列表中的所有元素
# del（）  删除列表  将列表对象删除
lst = [10,20,30,40,50,30]
lst.clear()
# del lst
# print(lst) # NameError: name 'lst' is not defined
# 修改列表中元素的值
lst = [10,20,30,40,50,30]
print(lst)
lst[0] = 100
print(lst)

lst = [10,20,30,40,50,30]
print(lst)
lst[1:3] = [100,200,300,400]  #  切片： 从1索引开始到3结束（）不包含索引为3的元素，用一个新的列表将切片的部分替换
print(lst)
"""
常见的两种方式：
	1.调用`sort（）`方法，列表中所有的元素默然按照从小到大的顺序进行排序，可以指定`reverse=True`，进行降序排序。
	2.调用内置函数`sorted（）`,可以指定`reverse=True`，进行降序排序，原列表不发生改变。
"""
lst = [34,23,14,57,1312,320]
print("排序前：",lst)
lst.sort(reverse=True)
print("排序后：",lst)

lst = [34,23,14,57,1312,320]
print("排序前：",lst)
new_list = sorted(lst,reverse=True)
print("排序后：",new_list)

# 列表生成式
lst = [i for i in range(1,10)]
print(lst)



